#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include<iostream>

using namespace std;
// int main()
// {
//     int fd[2] = {0};
//     if(pipe(fd) == -1)
//     {
//         perror("pipe");
//         return 1;
//     }

//     pid_t id = fork();
//     if(id == 0)
//     {
//         close(fd[0]);
//         const char* msg = "hello father, I am child...";
//         int count = 10;
//         while(count--)
//         {
//             write(fd[1], msg, strlen(msg));
//             sleep(1);
//         }
//         close(fd[1]);
//         exit(0);
//     }
//     else
//     {
//         close(fd[1]);
//         char buff[64];
//         while(1)
//         {
//             ssize_t s = read(fd[0], buff, sizeof(buff)-1);
//             if(s > 0)
//             {
//                 buff[s] = '\0';
//                 cout << "child send to father: " << buff << endl;
//             }
//             else if(s == 0)
//             {
//                 cout << "read file end" << endl;
//                 break;
//             }
//             else
//             {
//                 cout << "read error" << endl;
//                 break;
//             }
//         }
//         close(fd[0]);
//         waitpid(id, NULL, 0);
//     }
//     return 0;
// }


// #include <stdio.h>
// #include <unistd.h>
// #include <string.h>
// #include <stdlib.h>
// #include <sys/types.h>
// #include <sys/wait.h>
// int main()
// {
// 	int fd[2] = { 0 };
// 	if (pipe(fd) < 0){ //使用pipe创建匿名管道
// 		perror("pipe");
// 		return 1;
// 	}
// 	pid_t id = fork(); //使用fork创建子进程
// 	if (id == 0){
// 		//child
// 		close(fd[0]); //子进程关闭读端
// 		//子进程向管道写入数据
// 		const char* msg = "hello father, I am child...";
// 		int count = 10;
// 		while (count--){
// 			write(fd[1], msg, strlen(msg));
// 			sleep(1);
// 		}
// 		close(fd[1]); //子进程写入完毕，关闭文件
// 		exit(0);
// 	}
// 	//father
// 	close(fd[1]); //父进程关闭写端
// 	close(fd[0]); //父进程直接关闭读端（导致子进程被操作系统杀掉）
// 	int status = 0;
// 	waitpid(id, &status, 0);
// 	printf("child get signal:%d\n", status & 0x7F); //打印子进程收到的信号
// 	return 0;
// }

// #include <unistd.h>
// #include <stdio.h>
// #include <stdlib.h>
// #include <sys/wait.h>
// int main()
// {
// 	int fd[2] = { 0 };
// 	if (pipe(fd) < 0){ //使用pipe创建匿名管道
// 		perror("pipe");
// 		return 1;
// 	}
// 	pid_t id = fork(); //使用fork创建子进程
// 	if (id == 0){
// 		//child 
// 		close(fd[0]); //子进程关闭读端
// 		char c = 'a';
// 		int count = 0;
// 		//子进程一直进行写入，一次写入一个字节
// 		while (1){
// 			write(fd[1], &c, 1);
// 			count++;
// 			printf("%d\n", count); //打印当前写入的字节数
// 		}
// 		close(fd[1]);
// 		exit(0);
// 	}
// 	//father
// 	close(fd[1]); //父进程关闭写端

// 	//父进程不进行读取

// 	waitpid(id, NULL, 0);
// 	close(fd[0]);
// 	return 0;
// }

// #include <stdio.h>
// #include <pthread.h>
// #include <unistd.h>
// void* Routine(void* arg)
// {
// 	char* msg = (char*)arg;
// 	while (1)
//     {
// 		printf("I am %s\n", msg);
// 		sleep(1);
// 	}
// }

// int main()
// {
// 	pthread_t tid;
// 	pthread_create(&tid, NULL, Routine, (void*)"thread 1");
// 	while (1)
//     {
// 		printf("I am main thread!\n");
// 		sleep(2);
// 	}
//     pthread_join(tid, NULL);
// 	return 0;
// }


// #include <stdio.h>
// #include <stdlib.h>
// #include <pthread.h>
// #include <unistd.h>
// #include <sys/types.h>

// void* Routine(void* arg)
// {
// 	char* msg = (char*)arg;
// 	int count = 0;
// 	while (count < 5){
// 		printf("I am %s...pid: %d, ppid: %d, tid: %lu\n", msg, getpid(), getppid(), pthread_self());
// 		sleep(1);
// 		count++;
// 	}
// 	return NULL;
// }
// int main()
// {
// 	pthread_t tid[5];
// 	for (int i = 0; i < 5; i++){
// 		char* buffer = (char*)malloc(64);
// 		sprintf(buffer, "thread %d", i);
// 		pthread_create(&tid[i], NULL, Routine, buffer);
// 		printf("%s tid is %lu\n", buffer, tid[i]);
// 	}
// 	printf("I am main thread...pid: %d, ppid: %d, tid: %lu\n", getpid(), getppid(), pthread_self());
// 	for (int i = 0; i < 5; i++){
// 		pthread_join(tid[i], NULL);
// 		printf("thread %d[%lu]...quit\n", i, tid[i]);
// 	}
// 	return 0;
// }

// #include <stdio.h>
// #include <stdlib.h>
// #include <pthread.h>
// #include <unistd.h>
// #include <sys/types.h>

// void* Routine(void* arg)
// {
// 	pthread_detach(pthread_self());
// 	char* msg = (char*)arg;
// 	int count = 0;
// 	while (count < 5){
// 		printf("I am %s...pid: %d, ppid: %d, tid: %lu\n", msg, getpid(), getppid(), pthread_self());
// 		sleep(1);
// 		count++;
// 	}
// 	pthread_exit((void*)6666);
// }
// int main()
// {
// 	pthread_t tid[5];
// 	for (int i = 0; i < 5; i++){
// 		char* buffer = (char*)malloc(64);
// 		sprintf(buffer, "thread %d", i);
// 		pthread_create(&tid[i], NULL, Routine, buffer);
// 		printf("%s tid is %lu\n", buffer, tid[i]);
// 	}
// 	while (1){
// 		printf("I am main thread...pid: %d, ppid: %d, tid: %lu\n", getpid(), getppid(), pthread_self());
// 		sleep(1);
// 	}
// 	return 0;
// }
